package kr.co.bettersoft.carrotmemberstore.activity;

/**
 * Login 페이지.
 * 
 * 상단의 가맹점 등록 버튼을 눌러 신규 가입을 하거나
 * 아이디, 비밀번호를 입력하고 등록된 아이디로 로그인 할 수 있다.
 * 로그인 이후 탭호스트가  있는 메인 화면으로 이동한다.
 * 
 */

import org.json.JSONException;
import org.json.JSONObject;

import kr.co.bettersoft.carrotmemberstore.R;
import kr.co.bettersoft.carrotmemberstore.common.CarrotMemberStoreRest;
import kr.co.bettersoft.carrotmemberstore.common.CommonConstant;
import kr.co.bettersoft.carrotmemberstore.domain.CheckMileageMerchant;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class LoginPage extends Activity {

	String TAG = "LoginPage";
	
	final int LOGIN = 101;
	final int SELECT_MERCHANT_INFORMATION = 102;

	// 로그인용 아이디, 비번 값
	String merchantId = "";
	String password = "";

//	String imgDisplayDomain = CommonConstant.imgDisplayDomain;		// 용도가 다름	
//	String displayDomain = imgDisplayDomain;           //"http://www.mcarrot.net/upload/display/";	// 홈화면 광고 이미지 도메인 주소
	String displayDomain = CommonConstant.imgDisplayDomain;           //"http://www.mcarrot.net/upload/display/";	// 홈화면 광고 이미지 도메인 주소
	
	CarrotMemberStoreRest carrotMemberStoreRest;
	String callResult = "";
	String tempstr = "";
	JSONObject jsonObject;
//	carrotMemberStoreRest = new CarrotMemberStoreRest(); // oncreate
	
	Boolean loading = false;		// 중복 실행 방지 용도

	// 레이아웃의 개체들 - 등록버튼/로그인버튼, 아이디/비번입력창
	Button registerBtn, loginBtn;
	TextView idText,pwText;
	// 진행바
	ProgressBar pb1;		// 중단 로딩 진행바
	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;

	CheckMileageMerchant checkMileageMerchant;		// 가맹점 정보 받을 도메인 객체
	
	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("showToast")==1){		// 화면에 토스트 띄우기. 띄우는 문구는 msg 로 받은 값
					//					Toast.makeText(LoginPage.this, b.getString("msg"), Toast.LENGTH_SHORT).show();
					customToastShow(2,b.getString("msg"));
				}
				if(b.getInt("initLogin")==1){		// 화면 로그인 정보 초기화 하기
					idText.setText("");
					pwText.setText("");
					idText.requestFocus();		// 아디에 포커스 주기 
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.login_page_progressbar1);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.login_page_progressbar1);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				
				switch (msg.what)
				{
					case LOGIN   : runOnUiThread(new RunnableLogin());		
						break;
					case SELECT_MERCHANT_INFORMATION   : runOnUiThread(new RunnableSelectMerchantInformation());		
						break;	
					default : 
						break;
				}		
				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.login_page);
		carrotMemberStoreRest = new CarrotMemberStoreRest();
		Log.w(TAG,"LoginPage onCreate");
		parentLayout = findViewById(R.id.login_page_parent_layout);		// 부모 레이아웃- 리스너를 달아서 키보드 자동 숨김에 사용

		// 레이아웃의 개체들을 가져와서 사용
		registerBtn = (Button) findViewById(R.id.login_register_btn);
		loginBtn = (Button) findViewById(R.id.login_btn);
		idText = (TextView) findViewById(R.id.login_id_text);
		pwText = (TextView) findViewById(R.id.login_pw_text);

		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.w(TAG,"parentLayout click");
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);
			}
		});

		// 가맹점 정보 저장할 도메인 객체 생성
		checkMileageMerchant = new CheckMileageMerchant();

		// 버튼  리스너.
		registerBtn.setOnClickListener(new OnClickListener() {		// 가맹점 등록 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"registerBtn click");
				//				if(isNetworkAvailable()){
				if(!loading){
					loading = true;
					Intent nextIntent = new Intent(LoginPage.this, RegisterPage.class);	// 가맹점 등록 웹뷰 페이지로 이동. 
					startActivity(nextIntent);
					loading = false;
				}
				//				}else{
				//					showMsg(getString(R.string.network_error));
				//				}
			}
		});
		loginBtn.setOnClickListener(new OnClickListener() {			// 로그인 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"loginBtn click");
				if(!loading){
					loading = true;
//					new backgroundLogin().execute();		// 비동기 실행
					handler.sendEmptyMessage(LOGIN);
				}

			}
		});
	}

////////////////////////////////////////////////////////////////////////////////////////////////////


	/**
	 * 러너블.서버와 통신하여인증 1단계 수행.
	 */
	class RunnableLogin implements Runnable {
		public void run(){
			new backgroundLogin().execute();
		}
	}
	/**
	 * backgroundLogin
	 * 비동기로 로그인한다
	 *
	 * @param 
	 * @return 
	 */
	public class backgroundLogin extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundLogin");
			merchantId = idText.getText()+"";
			password = pwText.getText()+"";
			if(merchantId.length()<1){
				// 아이디 미입력
				showMsg(returnThis().getResources().getString(R.string.input_your_id));			// showMsg("아이디를 입력해 주십시오.");
				loading = false;
			}else if(password.length()<1){
				// 비번 미입력
				showMsg(returnThis().getResources().getString(R.string.input_your_pw));					// showMsg("비밀번호를 입력해 주십시오.");	
				loading = false;
			}else{
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);		// 키보드 숨김
				imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);
				//					login_pre();
				
				// 파리미터 세팅
				CheckMileageMerchant checkMileageMerchantParam = new CheckMileageMerchant();
				checkMileageMerchantParam.setMerchantId(merchantId);
				checkMileageMerchantParam.setPassword(password);
				// 호출
					showPb();
				callResult = carrotMemberStoreRest.RestLogin(checkMileageMerchantParam);
				hidePb();
				// 결과 처리
				if(callResult.equals("S")){
					processLoginResult();
	    		}else{	
					showMsg(returnThis().getResources().getString(R.string.request_failed));
					loading = false;
	    		}
			}
			return null; 
		}
	}
	
	/**
	 * 러너블.가맹점 정보 가져온다
	 */
	class RunnableSelectMerchantInformation implements Runnable {
		public void run(){
			new backgroundSelectMerchantInformation().execute();
		}
	}
	/**
	 * backgroundSelectMerchantInformation
	 * 비동기로 가맹점 정보 가져온다
	 *
	 * @param 
	 * @return 
	 */
	public class backgroundSelectMerchantInformation extends  AsyncTask<Void, Void, Void> { 
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundSelectMerchantInformation");
			
			// 파리미터 세팅
			CheckMileageMerchant checkMileageMerchantParam = new CheckMileageMerchant();
			checkMileageMerchantParam.setMerchantId(merchantId);
			// 호출
				showPb();
			callResult = carrotMemberStoreRest.RestSelectMerchantInformation(checkMileageMerchantParam);
			hidePb();
			// 결과 처리
			if(callResult.equals("S")){
				processSelectMerchantInformationData();
    		}else{	
    			showMsg(returnThis().getResources().getString(R.string.request_failed));		// 요청이 실패하였습니다.\n잠시후 다시 시도해 주십시오.
    			loading = false;
    		}
			return null; 
		}
	}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// 로그인 결과 정보를 받아서 처리한다.
	public void processLoginResult(){
		try {			// 파싱 
			tempstr = carrotMemberStoreRest.getTempstr();
			jsonObject = new JSONObject(tempstr);					
			JSONObject jsonobj2 = jsonObject.getJSONObject("checkMileageMerchant");
			String totalCount = "";
			try{
				totalCount = jsonobj2.getString("totalCount");
			}catch(Exception e){
				totalCount = "0";
			}		
			if(totalCount.equals("1")){
				// 로그인 성공
				if(CommonConstant.comeBack){		// 바탕화면 갔다와서 다시 로그인 할 경우..   
					Log.d(TAG,"come back");
					if((CommonConstant.tempMyID).equals(merchantId)){		// 아까 그 가맹점일 경우
						Log.d(TAG,"temp id = login id");
						
						// 자리만 다시 스왑.
						CommonConstant.comeBack = false;
						Intent TabIntent = new Intent(LoginPage.this, MainTabsPage.class);
						TabIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);		// 새 액티비티 열지 않고 자리만 스왑.
						startActivity(TabIntent);
					}else{		// 또다른 가맹점이 로그인 했을 경우
						Log.d(TAG,"temp id != login id");
						//가맹점 정보 가져오기
//						new backgroundSelectMerchantInformation().execute();	
						handler.sendEmptyMessage(SELECT_MERCHANT_INFORMATION);
					}
				}else{							// 일반적인 보통 로그인.
					//가맹점 정보 가져오기
//					new backgroundSelectMerchantInformation().execute();	
					handler.sendEmptyMessage(SELECT_MERCHANT_INFORMATION);
				}
			}else{	
				// 로그인 실패
				showMsg(returnThis().getResources().getString(R.string.login_failed));			// 로그인에 실패하였습니다.\n아이디,비밀번호를 다시 확인해주시기 바랍니다.	
				loading = false;
			}
			// 화면의 아이디, 비번 입력창 초기화.....
			initLogin();
		} catch (JSONException e) {
			hidePb();
			e.printStackTrace();
			loading = false;
		} 
	}
	
	// 가맹점 정보를 받아서 처리한다.
	public void processSelectMerchantInformationData(){
		try {
			// 데이터 세팅부..
			tempstr = carrotMemberStoreRest.getTempstr();
			jsonObject = new JSONObject(tempstr);
			JSONObject jsonobj2 = jsonObject.getJSONObject("checkMileageMerchant");
			try{
				checkMileageMerchant.setMerchantId(jsonobj2.getString("merchantId"));
			}catch(Exception e){
				checkMileageMerchant.setMerchantId(merchantId);
			}
			try{
				checkMileageMerchant.setPrPicture01Url(displayDomain+jsonobj2.getString("prPicture01"));
				String strr = displayDomain + jsonobj2.getString("prPicture01");
//				Log.d(TAG,"strr::"+strr);
			}catch(Exception e){
				checkMileageMerchant.setPrPicture01Url("");
			}
			try{
				checkMileageMerchant.setCountryCode(jsonobj2.getString("countryCode"));
			}catch(Exception e){
				checkMileageMerchant.setCountryCode("");
			}
			try{
				checkMileageMerchant.setLanguageCode(jsonobj2.getString("languageCode"));
			}catch(Exception e){
				checkMileageMerchant.setLanguageCode("");
			}
			hidePb();
			
			if(CommonConstant.comeBack){		// 홈 갔다 온 경우 + 새로운 아이디.
				MainTabsPage.merchantId = checkMileageMerchant.getMerchantId();
				MainTabsPage.countryCode = checkMileageMerchant.getCountryCode();
				MainTabsPage.languageCode = checkMileageMerchant.getLanguageCode();
				MainTabsPage.prPicture01Url = checkMileageMerchant.getPrPicture01Url();

				// 탭을첫번째 탭으로 해준다.
				// 이미 실행되어 있는 액티비티 이므로 추가 액티비티 실행은 없음. 대신 첫 탭으로 바꿔줌.
				MainTabsPage.initTab();
				
				// 자리만 다시 스왑
				CommonConstant.comeBack = false;
				Intent TabIntent = new Intent(LoginPage.this, MainTabsPage.class);
				TabIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);		// 새 액티비티 열지 않고 자리만 스왑.
				startActivity(TabIntent);
				
			}else {		// 그외 일반적인 경우
				Intent nextIntent = new Intent(LoginPage.this, MainTabsPage.class);		// 메인으로 이동 (+데이터 전달)
				nextIntent.putExtra("merchantId", checkMileageMerchant.getMerchantId());
				nextIntent.putExtra("countryCode", checkMileageMerchant.getCountryCode());
				nextIntent.putExtra("languageCode", checkMileageMerchant.getLanguageCode());
				//				nextIntent.putExtra("profileImageUrl", checkMileageMerchant.getProfileImageUrl());
				nextIntent.putExtra("prPicture01Url", checkMileageMerchant.getPrPicture01Url());
				startActivity(nextIntent);
			}
			loading = false;
		} catch (JSONException e) {
			e.printStackTrace();
			loading = false;
		} 
	}
	
	/////////////////////////////////////////////////////////////////////////////////////
	

	public Context returnThis(){			// this를 사용할 수 없는 곳에 this 를 전달하기 위함
		return this;
	}
	
	/*
	 * 핸들러 파트.
	 *  화면상의 변화가 있는 요청은 핸들러를 사용해야함
	 */
	// 화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	/**
	 * showMsg
	 * 화면에 토스트 띄운다  msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	 *
	 * @param msg
	 * @return 
	 */
	public void showMsg(final String msg){			
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showToast", 1);
						b.putString("msg", msg);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 
	// 아이디, 비번 초기화.  로그인 성공 또는 실패 이후 화면에 있던 로그인 정보를 초기화 한다.
	/**
	 * initLogin
	 * 아이디, 비번 초기화.  로그인 성공 또는 실패 이후 화면에 있던 로그인 정보를 초기화 한다.
	 *
	 * @param 
	 * @return 
	 */
	public void initLogin(){			
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("initLogin", 1);
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	} 



	//커스터마이징된 토스트를 띄우는 부분
	/**
	 * customToastShow
	 * 커스터마이징된 토스트를 띄운다
	 *
	 * @param img
	 * @param text
	 * @return 
	 */
	private void customToastShow(int img, CharSequence text) {
		//1
		LayoutInflater inflater = getLayoutInflater();
		View layout = inflater.inflate(R.layout.custom_toast_layout,
				(ViewGroup) findViewById(R.id.custom_toast_layout_root));
		TextView text2 = (TextView) layout.findViewById(R.id.custom_toast_text);
		text2.setText(text);
		text2.setTextSize(30);
		Toast toast = new Toast(getApplicationContext());
		toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
		toast.setDuration(Toast.LENGTH_SHORT);
		toast.setView(layout);toast.show();

		// 2
		//	  TextView tv = new TextView(this.getApplicationContext()); 
		//	  tv.setText("\t" + text + "\n");
		//	  tv.setTextSize(50);
		//	  tv.setTextColor(Color.BLACK); 
		//	  LinearLayout ll = new LinearLayout(this.getApplicationContext()); 
		//	  ll.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
		//	  //NOTICE 그림
		//	  if(img == 1) {
		//	   ll.setBackgroundResource(R.drawable.back2); 
		//	  }
		//	  ll.setGravity(Gravity.CENTER); 
		//	  ll.setPadding(0, 0, 0, 500);
		//	  ll.addView(tv); 
		////	  Toast t = Toast.makeText(this.getApplicationContext(), "", Toast.LENGTH_LONG); 
		//	  Toast t = Toast.makeText(this.getApplicationContext(), "", Toast.LENGTH_SHORT); 
		//	  t.setGravity(Gravity.CENTER, 0, 0); 
		//	  t.setView(ll); 
		//	  t.show(); 
	}

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 * 중앙 프로그래스바 보이게한다
	 *
	 * @param 
	 * @param 
	 * @return 
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 * 중앙 프로그래스바 숨긴다
	 *
	 * @param 
	 * @param 
	 * @return 
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}


	@Override
	public void onResume(){
		super.onResume();			// 다시 돌아온 경우에는 기능 잠금 해제. (버튼 사용 가능)
		loading = false;
	}
	@Override
	public void onDestroy(){
		try{
			android.os.Process.killProcess(android.os.Process.myPid()); 		// 완전한 종료를 시도	--> 혼자 종료
		}catch(Exception e){
			e.printStackTrace();
		}
		super.onDestroy();
	}
}
